package leetcode.editor.cn.dsa03_stack;
//有效括号字符串为空 ("")、"(" + A + ")" 或 A + B，其中 A 和 B 都是有效的括号字符串，+ 代表字符串的连接。例如，""，"()"
//，"(())()" 和 "(()(()))" 都是有效的括号字符串。 
//
// 如果有效字符串 S 非空，且不存在将其拆分为 S = A+B 的方法，我们称其为原语（primitive），其中 A 和 B 都是非空有效括号字符串。 
//
// 给出一个非空有效字符串 S，考虑将其进行原语化分解，使得：S = P_1 + P_2 + ... + P_k，其中 P_i 是有效括号字符串原语。 
//
// 对 S 进行原语化分解，删除分解中每个原语字符串的最外层括号，返回 S 。 
//
// 
//
// 示例 1： 
//
// 输入："(()())(())"
//输出："()()()"
//解释：
//输入字符串为 "(()())(())"，原语化分解得到 "(()())" + "(())"，
//删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。 
//
// 示例 2： 
//
// 输入："(()())(())(()(()))"
//输出："()()()()(())"
//解释：
//输入字符串为 "(()())(())(()(()))"，原语化分解得到 "(()())" + "(())" + "(()(()))"，
//删除每个部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。
// 
//
// 示例 3： 
//
// 输入："()()"
//输出：""
//解释：
//输入字符串为 "()()"，原语化分解得到 "()" + "()"，
//删除每个部分中的最外层括号后得到 "" + "" = ""。
// 
//
// 
//
// 提示： 
//
// 
// S.length <= 10000 
// S[i] 为 "(" 或 ")" 
// S 是一个有效括号字符串 
// 
// Related Topics 栈 
// 👍 142 👎 0

public class RemoveOutermostParentheses1021 {
    public static void main(String[] args) {
        Solution solution = new RemoveOutermostParentheses1021().new Solution();
        String[] arr = {"(()())(())", "(()())(())(()(()))", "()()"};
        for (int i = 0; i < arr.length; i++) {
            String ret = solution.removeOuterParentheses(arr[i]);
            System.out.println(arr[i] + "====>" + ret);
        }
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 解法一：暴力解法思路分析
         * 1.定义容器存储删除外层括号后的原语子串
         *   new StringBuilder();
         * 2.定义左括号、右括号计数器：
         *   int left = 0, right = 0;
         * 3.遍历字符串，读取到括号时对应计数器自增
         * 4.检查是否到达原语结尾，截取不包含最外层的原语子串并拼接到容器中
         *
         * 边界问题：
         *     遍历字符串，注意索引越界：i < S.length()
         *     截取原语字符串时，注意起止索引：[start, end)
         * 细节问题：
         *     需要记录上一次截取原语子串之后的位置
         * @param str
         * @return
         */
        public String removeOuterParentheses(String str) {
            int len = str.length();
            // 1.定义容器存储删除外层括号后的原语子串
            StringBuilder sb = new StringBuilder();
            // 2.定义左括号、右括号计数器
            int left = 0, right = 0, lastOpr = 0;
            // 3.遍历字符串，读取到括号时对应计数器自增
            for (int i = 0; i < len; i++) {
                char c = str.charAt(i);
                if (c == '(') {
                    left++;
                } else {
                    right++;
                }
                // 4.检查是否到达某个原语结尾，截取不包含最外层的原语子串添加到容器
                if (left == right) {
                    sb.append(str.substring(++lastOpr, i));
                    lastOpr = i + 1;
                }
            }
            return sb.toString();
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)
}
